import pandas as pd
import random
import numpy as np

APPS=["小红书", "抖音", "快手", "B站", "微博", "淘宝", "京东", "拼多多", "知乎", "今日头条"]
MAX_USE_CNT= 100


def gen_user_id():
    res=[]

    for i in range(1,301):
        if(i<10):
            res.append(f"user_id_00{i}")
        elif(i<100):
            res.append(f"user_id_0{i}")
        else:
            res.append(f"user_id_{i}")
    return res

def simulate_usage_time(usage_count):
    """
    模拟用户单日使用时长（单位：分钟）
    """
    if usage_count <= 0:
        return 0.0
    
    # 基础模型：每次使用时长 = 基础时长 + 随机波动
    # 参数设置（可根据实际数据调整）：
    base_time_per_use = 15.0  # 每次使用基础时长（分钟）
    time_std = 2.0           # 时长波动标准差
    
    # 生成总时长（正态分布保证多数情况合理，截断处理负值）
    total_time = 0
    for _ in range(usage_count):
        # 每次使用时长的随机波动（均值为base_time_per_use，标准差time_std）
        single_use_time = np.random.normal(base_time_per_use, time_std)
        total_time += max(0.5, single_use_time)  # 确保单次使用不低于0.5分钟
    
    return round(total_time, 1)

def simulate_usage_data(usage_count, usage_time):
    """
    基于使用次数和使用时长模拟用户单日使用流量（单位：MB）
    """
    # 处理边界情况
    if usage_count <= 0 or usage_time <= 0:
        return 0.0
    
    # 1. 计算平均每次使用时长的比例（用于衡量使用强度）
    avg_time_per_use = usage_time / usage_count
    
    # 2. 基础流量率（MB/分钟） - 根据平均每次使用时长调整
    # 当平均每次使用时间短时，流量率较高（可能是在浏览内容）
    # 当平均每次使用时间长时，流量率较低（可能是在阅读或轻度使用）
    base_data_rate = 0.8 + (2.5 / (0.5 * avg_time_per_use + 1))
    
    # 3. 基于使用次数的调整因子
    # 使用次数多时，流量消耗效率可能降低（用户更熟悉APP，操作更高效）
    usage_factor = 1.2 - (0.4 * np.tanh(usage_count / 8))
    
    # 4. 基于使用时长的调整因子
    # 使用时间长时，流量消耗效率可能降低（可能包含更多低流量活动）
    time_factor = 1.0 - (0.3 * np.tanh(usage_time / 60))
    
    # 5. 随机波动（考虑网络环境、内容类型等随机因素）
    random_factor = np.random.uniform(0.85, 1.15)
    
    # 6. 计算总流量
    total_data = usage_time * base_data_rate * usage_factor * time_factor * random_factor
    
    # 确保结果合理（非负，最小值约束）
    return round(max(0.1, total_data), 1)

def gen_dummy_data():
    """
    生成单日用户使用APP信息
    """
    data = []
    for user_id in gen_user_id():
        apps= random.sample(APPS, k=random.randint(1, len(APPS)))  # 随机选择1到所有应用
        for app in apps:
            # 正态分布随机生成用户使用当前app的次数
            use_cnt = min(int(random.gauss(10, 5)), MAX_USE_CNT)
            # 模拟生成用户使用当前app时长
            use_time = simulate_usage_time(use_cnt)
            use_data= simulate_usage_data(use_cnt, use_time)
            data.append({
                "user_id": user_id,
                "app_name": app,
                "use_cnt": use_cnt,
                "use_time (min)": use_time,
                "use_data (mb)": use_data
            })
    return data


def csv_to_file(data, filename):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding='utf-8-sig')


if __name__ == "__main__":
    data = gen_dummy_data()
    csv_to_file(data, "dummy_data.csv")
    print("Dummy data generated and saved to dummy_data.csv")